#!/usr/bin/env python
# coding: utf-8


import pandas as pd 
import numpy as np
np.seterr(divide='ignore', invalid='ignore')


cose_list = ['SC8888.XINE', 'AG8888.XSGE', 'AL8888.XSGE', 'AU8888.XSGE', 'BU8888.XSGE', 'CU8888.XSGE', 'FU8888.XSGE',
            'HC8888.XSGE', 'NI8888.XSGE', 'PB8888.XSGE', 'RB8888.XSGE', 'RU8888.XSGE', 'SN8888.XSGE', 'ZN8888.XSGE',
            'SP8888.XSGE', 'AP8888.XZCE', 'CF8888.XZCE', 'FG8888.XZCE', 'MA8888.XZCE', 'OI8888.XZCE', 'RM8888.XZCE',
            'SF8888.XZCE', 'SM8888.XZCE', 'SR8888.XZCE', 'TA8888.XZCE', 'ZC8888.XZCE', 'A8888.XDCE', 'B8888.XDCE',
            'C8888.XDCE', 'CS8888.XDCE', 'I8888.XDCE', 'J8888.XDCE', 'JD8888.XDCE', 'JM8888.XDCE', 'L8888.XDCE',
            'M8888.XDCE', 'P8888.XDCE', 'PP8888.XDCE', 'V8888.XDCE', 'Y8888.XDCE', 'EG8888.XDCE']


# 下载数据
def downdata_w(starttime='2019-01-01 09:00:00', endtime='2020-10-13 15:00:00'):
    for i in range(1):
        df_data = get_price(cose_list[i], starttime, endtime, frequency='1m')
        code_i = cose_list[i].split('.')[0]
        df_data.to_csv(code_i + '.csv')
        return df_data




get_ipython().run_line_magic('pinfo', 'get_price')



df_data.head()



def period_minute(df_data,windows):#合并的时间周期
    time_t=list(df_data.index.astype(str))
    open_t=df_data['open'].values
    close_t=df_data['close'].values
    high_t=df_data['high'].values
    low_t=df_data['low'].values
    vol_t=df_data['volume'].values
    money_t=df_data['money'].values
    ###
    time_list=[]
    open_list=[]
    close_list=[]
    high_list=[]
    low_list=[]
    vol_list=[]
    money_list=[]
    #####
    if len(time_t)>windows:
        for i in range(len(time_t)):
            if (i+1)%windows==0:#从0开始编号
                start=i+1-windows#算开始的时间
                open_list.append(open_t[start])
                close_list.append(close_t[i])
                high_list.append(max(high_t[start:i+1]))
                low_list.append(min(low_t[start:i+1]))
                vol_list.append(sum(vol_t[start:i+1]))
                money_list.append(sum(money_t[start:i+1]))
                time_list.append(time_t[start]+'_'+time_t[i])
        df_minute=pd.DataFrame({'time':time_list,'open':open_list,'close':close_list,'high':high_list,
                           'low':low_list,'vol':vol_list,'money':money_list})
        return df_minute
  
    #else:
        print('周期窗口太大')#数据不够
        return pd.DataFrame()


# In[6]:


##定义移动平均
def index_sma(array_close,big_w):#收盘价序列和几周期移动平均
    sma_t=np.zeros(len(array_close))#产生一个长度和收盘价序列一样长的0序列
    if big_w>1:
        for i in range(len(array_close)):
            if i==0:
                sma_t[i]=array_close[i]
            else:
                sma_t[i]=(1*array_close[i]+(big_w-1)*sma_t[i-1])/big_w#计算移动平均：当前价加前面家除以周期
    else:
        print('长短周期不合适.')
    return sma_t
def Index_rsi(array_close,window):
    #参数涉及三个周期6,12,24
    lc_v=np.zeros(len(array_close))
    max_v=np.zeros(len(array_close))
    abs_v=np.zeros(len(array_close))
    for i in range(len(array_close)):
        if i==0:
            lc_v[i]=array_close[i]#前一个收盘价
        else:
            lc_v[i]=array_close[i-1]
        max_v[i]=max(array_close[i]-lc_v[i],0)#后一个比前一个收盘价高的话取差值，小的话取0
        abs_v[i]=abs(array_close[i]-lc_v[i])#都取差值的绝对值
    rsi_1=index_sma(max_v,window)/index_sma(abs_v,window)*100#都取移动平均
    #注意，np.array([0,1,2,3])/np.array([0,1,2,3])可以得到结果，但是0/0单独运算会报错,所以填充缺失值#一一对应除，且报错时用缺失值填充
    rsi_1[0]=100#把第一个数字默认为100
    rsi_1=np.around(rsi_1,decimals=3)#每个数字保留三位小数
    return rsi_1


# In[7]:


def select_peak(df_minute,min_value=10,max_value=90):#找峰值
    time_t=df_minute['time'].values#获取时间
    array_rsi=df_minute['rsi'].values#获取rsi值
    min_array=[]#最小的rsi
    min_time=[]#最小的rsi对应的时间
    max_array=[]#最大的rsi
    max_time=[]#最大的rsi对应的时间
    for i in range(1,len(array_rsi)-1):#从第二个开始到倒数第二个结束是由比较的性质决定的
        if array_rsi[i-1]<array_rsi[i] and array_rsi[i]>array_rsi[i+1] and array_rsi[i]>=max_value:#呈尖峰且值大于90
            max_array.append(array_rsi[i])
            max_time.append(time_t[i])
        elif array_rsi[i-1]>array_rsi[i] and array_rsi[i]<array_rsi[i+1] and array_rsi[i]<=min_value:
            min_array.append(array_rsi[i])
            min_time.append(time_t[i])
    if len(max_array)>0:#至少要有一个满足条件的峰值
        max_std=np.std(max_array)
    else:
        max_std=0
    if len(min_array)>0:
        min_std=np.std(min_array)
    else:
        min_std=0
    return max_std,min_std#峰值标准差、波谷标准差


# In[ ]:


# 品种 周期 峰标准差  波谷标准差
# sc  100   12 0 0
# sc 4  5 0.3  1.0
# sc  1 4 0.9  1.4
# sc 2 8 0.8  1.3
# sc 3  10 .8  1.3


def search_best(df_temp,fix_var):#单个品种各周期峰值、波谷标准差，求峰值还是波谷
    df_temp.sort_values(by=fix_var,ascending=True,inplace=True)
    code_i=df_temp['code'].values[0]#品种
    period_i=df_temp['period'].values#周期序列
    par_i=df_temp['rsi_par'].values#标准差最小的rsi参数序列
    values_i=df_temp[fix_var].values#峰值或波谷那一列所有周期所有rsi参数的标准差
    flag=0
    for i in range(len(df_temp)):
        if values_i[i] > 0:
            flag = 1
            return code_i,period_i[i],par_i[i]
            break       #一旦满足标准差不为0，只循环一次
    if flag == 0:
        print('参数设置有问题')
        return code_i, 0, 0

